[IA64] Fix MINSTATE_START/END_SAVE_MIN_PHYS for INIT handler
authorawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Thu, 6 Jul 2006 16:32:26 +0000 (10:32 -0600)
committerawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Thu, 6 Jul 2006 16:32:26 +0000 (10:32 -0600)
- THIS_CPU(ia64_mca_data)  have physcal address of each cpu's ia64_mca_cpu.
  I computed address of init_stack by using it.
- from dep r12=-1,r12,61,3; to dep r12=-1,r12,60,4;
  to computed xen virtual address.

Signed-off-by: Akio Takebe <takebe_akio@jp.fujitsu.com>
xen/arch/ia64/linux-xen/minstate.h

index 16b21443adc2cc4bf13e8cf2a2e6d272e162bc10..69786cee0f526be28738c71ae1b063c650ffd1ba 100644 (file)
  * For mca_asm.S we want to access the stack physically since the state is saved before we
  * go virtual and don't want to destroy the iip or ipsr.
  */
-#define MINSTATE_START_SAVE_MIN_PHYS                                                           \
+#ifdef XEN
+# define MINSTATE_START_SAVE_MIN_PHYS                                                          \
+(pKStk)        movl r3=THIS_CPU(ia64_mca_data);;                                                       \
+(pKStk)        tpa r3 = r3;;                                                                           \
+(pKStk)        ld8 r3 = [r3];;                                                                         \
+(pKStk)        addl r3=IA64_MCA_CPU_INIT_STACK_OFFSET,r3;;                                             \
+(pKStk)        addl r1=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r3;                                           \
+(pUStk)        mov ar.rsc=0;           /* set enforced lazy mode, pl 0, little-endian, loadrs=0 */     \
+(pUStk)        addl r22=IA64_RBS_OFFSET,r1;            /* compute base of register backing store */    \
+       ;;                                                                                      \
+(pUStk)        mov r24=ar.rnat;                                                                        \
+(pUStk)        addl r1=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r1;   /* compute base of memory stack */      \
+(pUStk)        mov r23=ar.bspstore;                            /* save ar.bspstore */                  \
+(pUStk)        dep r22=-1,r22,60,4;                    /* compute Xen virtual addr of RBS */   \
+       ;;                                                                                      \
+(pUStk)        mov ar.bspstore=r22;                    /* switch to Xen RBS */                 \
+       ;;                                                                                      \
+(pUStk)        mov r18=ar.bsp;                                                                         \
+(pUStk)        mov ar.rsc=0x3;  /* set eager mode, pl 0, little-endian, loadrs=0 */                    \
+
+# define MINSTATE_END_SAVE_MIN_PHYS                                                            \
+       dep r12=-1,r12,60,4;        /* make sp a Xen virtual address */                 \
+       ;;
+#else
+# define MINSTATE_START_SAVE_MIN_PHYS                                                          \
 (pKStk) mov r3=IA64_KR(PER_CPU_DATA);;                                                         \
 (pKStk) addl r3=THIS_CPU(ia64_mca_data),r3;;                                                   \
 (pKStk) ld8 r3 = [r3];;                                                                                \
 (pUStk)        mov r18=ar.bsp;                                                                         \
 (pUStk)        mov ar.rsc=0x3;         /* set eager mode, pl 0, little-endian, loadrs=0 */             \
 
-#define MINSTATE_END_SAVE_MIN_PHYS                                                             \
+# define MINSTATE_END_SAVE_MIN_PHYS                                                            \
        dep r12=-1,r12,61,3;            /* make sp a kernel virtual address */                  \
        ;;
+#endif /* XEN */
 
 #ifdef MINSTATE_VIRT
 #ifdef XEN